﻿using System;
using System.Collections.Generic;
using System.Text;
using BussinessLogicTecnoPez.Tipos_Comunes;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace BussinessLogicTecnoPez.Produccion.Compras
{
    [Serializable]
    [DBTable("ORDENESPAGO")]
    public class OrdenPago : EntityBase<OrdenPago>
    {
        private int idOrdenPago;
        private decimal montoTotal;
        private TipoMoneda objTipoMoneda;
        private DateTime fecha;
        private Proveedor objProveedor;
        private DateTime fechaVencimiento;
        private bool anulada;
        private DetalleOrdenPago objDetalle;

        [FriendlyName("Código",true)]
        [DBField("IDORDENPAGO",true,true)]
        public int IdOrdenPago
        {
            get { return idOrdenPago; }
            set { idOrdenPago = value; }
        }

        [NotNullValidator(MessageTemplate = "Proveedor: debe tener algún valor.")]
        [FriendlyName("Proveedor", true)]
        [DBField("IDPROVEEDOR", false, false, true, "IDPROVEEDOR")]
        public Proveedor Proveedor
        {
            get { return objProveedor; }
            set { objProveedor = value; }
        }

        [NotNullValidator(MessageTemplate = "Moneda: debe tener algún valor.")]
        [FriendlyName("Moneda", true)]
        [DBField("IDTIPOMONEDA", false, false, true, "IDTIPOMONEDA")]
        public TipoMoneda TipoMoneda
        {
            get { return objTipoMoneda; }
            set { objTipoMoneda = value; }
        }

        [FriendlyName("Monto", true)]
        [DBField("MONTOTOTAL",false,false)]
        public decimal MontoTotal
        {
            get { return montoTotal; }
            set { montoTotal = value; }
        }

        [NotNullValidator(MessageTemplate = "Fecha: debe tener algún valor.")]
        [FriendlyName("Fecha", false)]
        [DBField("FECHA", false, false)]
        public DateTime Fecha
        {
            get { return fecha; }
            set { fecha = value; }
        }

        [NotNullValidator(MessageTemplate = "Fecha vencimiento: debe tener algún valor.")]
        [FriendlyName("Fecha Vencimiento", false)]
        [DBField("FECHAVENCIMIENTO", false, false)]
        public DateTime FechaVencimiento
        {
            get { return fechaVencimiento; }
            set { fechaVencimiento = value; }
        }

        [FriendlyName("Fecha Vencimiento", true)]
        public string FechaVencimientoString
        {
            get { return fechaVencimiento.ToShortDateString(); }
        }

        [FriendlyName("Anulada", false)]
        [DBField("ANULADA", false, false)]
        public bool Anulada
        {
            get { return anulada; }
            set { anulada = value; }
        }

        public override string ToString()
        {
            return this.IdOrdenPago.ToString();
        }

        [DBFieldDetail("IDORDENPAGO", typeof(ItemDetalleOrdenPago))]
        public DetalleOrdenPago DetalleOrdenPago
        {
            get { return objDetalle; }
            set { objDetalle = value; }
        }

        /// <summary>
        /// Setea el estado de los pedidos asociados como "pendientes de pago"
        /// </summary>
        /// <returns>True si no ocurrieron errores</returns>
        public bool SetStatePedidos()
        {
            if (this.DetalleOrdenPago == null || this.DetalleOrdenPago.ItemList.Count <= 0)
            {
                throw new BussinessLogicTecnoPezException("La orden de pago no posee detalle.");
            }
            try
            {
                //El estado 2 es "Pendiente de pago"
                TipoEstadoPedidoProveedor.getManager.ClearFilters();
                TipoEstadoPedidoProveedor.getManager.AddFilter("IDTIPOESTADOPEDIDOPROVEEDOR", GenericManager<TipoEstadoPedidoProveedor>.filterOperator.Equals, 2);
                TipoEstadoPedidoProveedor objEstado = TipoEstadoPedidoProveedor.getManager.GetOne();
                ItemDetalleOrdenPago objItem;
                for (int i = 0; i < this.DetalleOrdenPago.ItemList.Count; i++)
                {
                    objItem = (ItemDetalleOrdenPago)this.DetalleOrdenPago.ItemList[i];
                    objItem.PedidoProveedor.TipoEstadoPedidoProveedor = objEstado;
                    if (!PedidoProveedor.getManager.Update(objItem.PedidoProveedor))
                    {
                        throw PedidoProveedor.getManager.GeneratedException;
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
